package lock;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author admin
 *
 * 重入锁（Reentrant Lock）是一种特殊类型的锁，它允许同一个线程在持有锁的情况下，多次进入并获取该锁而不会发生死锁。
 * 也就是说，当一个线程已经获得了锁，如果它再次请求该锁，它可以再次成功获取该锁，而不需要等待自己释放锁。这是重入锁的一个重要特性。
 *
 * 重入锁的关键特点：
 * 同一线程可以多次获取锁：线程可以在持有锁时进入该锁多次，锁会为该线程提供一个“重入计数器”，每次该线程获得锁时，计数器会加 1；每次释放锁时，计数器减 1，直到计数器为 0 时，锁才会真正被释放，其他线程才能获得该锁。
 *
 * 防止死锁：重入锁的最大优势是它能防止死锁。假设线程已经持有一个锁并进入一个方法，如果这个方法再调用另一个需要获取相同锁的方法，重入锁会允许该线程再次获得锁，而不会让自己陷入死锁的状态。
 *
 * 公平性（可选）：虽然重入锁本身并不关心公平性问题，但在 Java 中，ReentrantLock 提供了一个可选的公平性设置，允许锁按请求顺序分配给线程，避免线程饥饿问题。
 */
public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void method1() {
        lock.lock();
        try {
            System.out.println("Thread acquired lock in method1");
            method2();  // 调用 method2 时仍然能获取到锁
        } finally {
            lock.unlock();
        }
    }

    public void method2() {
        lock.lock();
        try {
            System.out.println("Thread acquired lock in method2");
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample example = new ReentrantLockExample();
        example.method1();
    }
}
